import pygame
import time
import random


# 初始化
pygame.init()
# 这里是设置的常量值
FPS = 65
# 游戏的背景颜色
BG_COLOR = pygame.Color(112, 128, 105)
# 屏幕大小
SIZE = pygame.display.list_modes()[0]
SHIJIAN = time.strftime("%Y.%m.%d %H:%M:%S", time.localtime(time.time()))


class MyGame:
    """这是一个游戏的主类"""

    windos = None
    clock = None

    # 存储我们子弹
    zidan_list = []  # 子弹的列表

    def run_game(self):
        MyGame.windos = pygame.display.set_mode(
            (SIZE[0] / 2, SIZE[1] / 2), flags=pygame.RESIZABLE
        )
        # 设置屏幕的刷新
        MyGame.clock = pygame.time.Clock()

        # 创建我们的坦克
        tk = MyTank()

        # 创建地方坦克 创建10个
        ai_tank = [AlTank() for i in range(20)]

       

        while 1:
            """需要循环执行的代码"""
            # 游戏的帧率
            MyGame.clock.tick(FPS)
            # 这个是刷新率
            r = MyGame.clock.get_fps()
            # 这个是标题
            pygame.display.set_caption(f"坦克大战1.0\t\t{SHIJIAN}\t\t\t\t\tfps:{r:.2f}")

            # 这个是背景颜色
            MyGame.windos.fill(BG_COLOR)
            # 这个是获取窗口的位置
            MyGame.windos.get_rect()

            # 实现我们窗口最大化最小化 可以关闭窗口
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    exit()
                elif event.type == pygame.KEYDOWN:
                    # 发射子弹逻辑
                    if event.key == pygame.K_SPACE:
                        new_bullet = ZiDan(tk)
                        MyGame.zidan_list.append(new_bullet)

                    # print('您按下了按键')  控制坦克
                    tk.update_key_down(event.key)
                elif event.type == pygame.KEYUP:
                    # print('您松开了按键')
                    tk.update_key_up(event.key)

            # 这个是绘制我们的坦克
            tk.tank_move()
            # 移动我们坦克
            tk.draw(MyGame.windos)

            # 移动并绘制敌方坦克
            for enemy_tank in ai_tank:
                enemy_tank.etank_move()
                enemy_tank.draw(MyGame.windos)

            # 敌人的坦克不一定发射子弹 一定概率的发射
            # 敌方坦克发射子弹逻辑
            for enemy_tank in ai_tank:
                if random.randint(1, 300) < 10:  # 一定概率发射子弹
                    new_bullet = ZiDan(enemy_tank)
                    MyGame.zidan_list.append(new_bullet)

            # 移动并处理子弹
            for bullet in MyGame.zidan_list:
                bullet.bullet_move()
                bullet.draw(MyGame.windos)
                if not bullet.zidancunhuo:
                    MyGame.zidan_list.remove(bullet)

            # 这个是刷新
            pygame.display.update()


class MyTank:
    """这个是我的坦克"""

    def __init__(self):

        # 设置我方坦克资源，用字典方式存储下来
        self.images = {
            "U": pygame.image.load("./imag/myTankU.gif"),  # up  上
            "D": pygame.image.load("./imag/myTankD.gif"),  # down 下
            "L": pygame.image.load("./imag/myTankL.gif"),  # litf 左
            "R": pygame.image.load("./imag/myTankR.gif"),  # right 右
        }
        # 设置我方坦克反向
        self.fangxiang = "U"
        # 获取图片信息  这是默认的方向  #字典的获取方法 字典的键作为开关，值作为随机值
        self.image = self.images.get(self.fangxiang)
        self.rect = self.image.get_rect()  # 这一步是获取了坦克的全部尺寸

        # 绘制我方坦克的位置  获取窗口位置  设置我们坦克的位置
        MyGame.windos1 = MyGame.windos.get_rect()
        self.rect.centerx = MyGame.windos1.centerx
        self.rect.centery = MyGame.windos1.centery + 200

        # 2,设置我们坦克 移动步长和速度
        self.speed = 2
        self.sudu = 5

        # 设置我们坦克的方向

        # 设置开关
        self.move_up = False
        self.move_down = False
        self.move_left = False
        self.move_right = False

    def draw(self, surface):
        """这是绘制我们坦克的方法"""
        self.image = self.images.get(self.fangxiang)
        surface.blit(self.image, self.rect)

    # 3,编写我们按键的方法  按下去之后为True
    def update_key_down(self, key):
        if key == pygame.K_UP or key == pygame.K_w:
            self.move_up = True
            print("按了上键")
            # 修改我们坦克的方向
            self.fangxiang = "U"

        elif key == pygame.K_DOWN or key == pygame.K_s:
            self.move_down = True
            print("按了下键")
            # 修改坦克的方向
            self.fangxiang = "D"

        elif key == pygame.K_LEFT or key == pygame.K_a:
            self.move_left = True
            print("按了左键")
            # 修改坦克的方向
            self.fangxiang = "L"

        elif key == pygame.K_RIGHT or key == pygame.K_d:
            self.move_right = True
            print("按了右键")
            # 修改坦克的方向
            self.fangxiang = "R"

    # 4,松开按键之后为False
    def update_key_up(self, key):
        if key == pygame.K_UP or key == pygame.K_w:
            self.move_up = False

        elif key == pygame.K_DOWN or key == pygame.K_s:
            self.move_down = False

        elif key == pygame.K_LEFT or key == pygame.K_a:
            self.move_left = False

        elif key == pygame.K_RIGHT or key == pygame.K_d:
            self.move_right = False

    def tank_move(self):
        """这是坦克移动的方法"""
        if (
            not self.move_up
            and not self.move_down
            and not self.move_left
            and not self.move_right
        ):
            return
        if (
            self.fangxiang == "U" and self.move_up and self.rect.top > 0
        ):  # 往上  #到边界后就不在移动
            self.rect.centery = self.rect.centery - self.speed * self.sudu

        if (
            self.fangxiang == "D" and self.rect.bottom < MyGame.windos1.bottom
        ):  # 往下  #到边界后就不在移动
            self.rect.centery = self.rect.centery + self.speed * self.sudu

        if self.fangxiang == "L" and self.rect.left > 0:  # 往左  #到边界后就不在移动
            self.rect.centerx = self.rect.centerx - self.speed * self.sudu

        if (
            self.fangxiang == "R" and self.rect.right < MyGame.windos1.right
        ):  # 往右  #到边界后就不在移动
            self.rect.centerx = self.rect.centerx + self.speed * self.sudu


class AlTank:
    """这个是地方坦克"""

    def __init__(self):
        # 加载电脑的坦克
        self.images = {
            "U": pygame.image.load("./imag/TankU.gif"),  # up  上
            "D": pygame.image.load("./imag/TankD.gif"),  # down 下
            "L": pygame.image.load("./imag/TankL.gif"),  # litf 左
            "R": pygame.image.load("./imag/TankR.gif"),  # right 右
        }

        # 设置敌方坦克出身方向 随机
        self.fangxiang = self.ran_fangxiang()
        # 获取图片信息  这是默认的方向  #字典的获取方法 字典的键作为开关，值作为随机值
        self.image = self.images.get(self.fangxiang)
        self.rect = self.image.get_rect()  # 这一步是获取了坦克的全部尺寸

        # 确定敌方坦克在屏幕上的位置
        self.top = (
            MyGame.windos1.top + 20
        )  # 从最上面一排刷新  屏幕的最上面尺寸+坦克高度的一半
        self.left = random.randint(0, int(SIZE[1]))  # 屏幕的宽度和0之间随机值刷新坦克
        self.rect.centerx = self.left  # 敌方坦克的中心x横轴坐标
        self.rect.centery = self.top  # 敌方坦克的中心y纵轴坐标

        # 初始步长  每一个电脑循环的步长
        self.step = 40

    def ran_fangxiang(self):
        """编写一个获取随机方向的函数"""
        a = random.randint(1, 4)
        if a == 1:
            return "U"
        if a == 2:
            return "L"
        if a == 3:
            return "R"
        if a == 4:
            return "D"

    def etank_move(self):
        """
        随机移动
        """
        # 判断步长是否为0
        if self.step <= 0:
            # 如果小于0,更换方向
            self.fangxiang = self.ran_fangxiang()
            # 重置步长
            self.step = 40
        else:
            # 如果大于0,移动
            self.tank_move()
            # 步长减1
            self.step = self.step - 1

    def tank_move(self):
        # 根据当前方向移动敌方坦克
        if self.fangxiang == "U" and self.rect.top > 0:
            self.rect.centery -= 1
        if self.fangxiang == "D" and self.rect.bottom < MyGame.windos1.bottom:
            self.rect.centery += 1
        if self.fangxiang == "L" and self.rect.left > 0:
            self.rect.centerx -= 1
        if self.fangxiang == "R" and self.rect.right < MyGame.windos1.right:
            self.rect.centerx += 1

    def draw(self, surface):
        """绘制坦克到桌布"""
        self.image = self.images.get(self.fangxiang)
        surface.blit(self.image, self.rect)


class ZiDan():
    """我方坦克和地方坦克发射的子弹类"""
    def __init__(self,tank):
        # 加载子弹的图片
        self.image=pygame.image.load('./imag/zidan.gif')
        #确定子弹的方向
        self.fangxiang=tank.fangxiang   #这里的tank 我方坦克发射子弹的时候 是tank=Mygame.my_tank
        #获得子弹的图片尺寸
        self.rect=self.image.get_rect()

        if self.fangxiang=='U':  #当方向为上的时候
            # 子弹的x坐标应该是   坦克的中心子弹的   y轴坐标应该是   坦克的中心-坦克高度的一半-子弹高度的一半
            self.rect.centerx=tank.rect.centerx  #tank 这里是等于MyTank()
            self.rect.centery=tank.rect.centery-tank.rect.height/2-self.rect.height/2
        if self.fangxiang == 'D':  # 当方向下的时候
            # 子弹的x轴  坦克的中心    y轴是 坦克的中心+坦克的高度一半+子弹高度的一半
            self.rect.centerx = tank.rect.centerx
            self.rect.centery = tank.rect.centery + tank.rect.height / 2 + self.rect.height / 2
        if self.fangxiang=='L':  #当方向为左的时候
            # 当坦克往左的时候： 子弹的中心 坦克的的中心-坦克宽度的一半-子弹宽度的一半   y轴 就是坦克的中心
            self.rect.centerx=tank.rect.centerx-tank.rect.width/2-self.rect.width/2
            self.rect.centery=tank.rect.centery
        if self.fangxiang=='R':  #当方向为右的的时候
            # 子弹的x坐标应该是   坦克的中心子弹的   y轴坐标应该是   坦克的中心-坦克高度的一半+子弹高度的一半
            self.rect.centerx=tank.rect.centerx+tank.rect.height/2+self.rect.height/2
            self.rect.centery=tank.rect.centery

        #设置子弹速度 继承坦克的速度的2倍
        self.bullet_sleep=10
  
        #默认子弹是存货的状态
        self.zidancunhuo=True


    def draw(self, surface):
        '''这是子弹显示的函数'''
        surface.blit(self.image, self.rect)

    def bullet_move(self):
        '''这是子弹移动的方法'''
        #同坦克的移动一样  因为我们取消了左右上下移动的开关，所以他可以i自由移动的直线移动
        #子弹首先是要根据其方向然后开始移动
        if self.fangxiang == 'U':
            if self.rect.top > 0:  # 往上  #到边界后就不在移动
                #因为这个方向一直是往左的，所以每次都会一直-这个移动系数，也就产生了动画效果，持续移动
                self.rect.centery = self.rect.centery - self.bullet_sleep 
            else:
                    #子弹有方向且子弹在屏幕中，那么就是存活 反之就让他关闭
                self.zidancunhuo=False
        elif self.fangxiang == 'D' :
            if self.rect.bottom < MyGame.windos1.bottom:  # 往下  #到边界后就不在移动
                self.rect.centery = self.rect.centery + self.bullet_sleep 
            else:
                self.zidancunhuo=False
        if self.fangxiang == 'L':
            if self.rect.left > 0:  # 往左  #到边界后就不在移动
                self.rect.centerx = self.rect.centerx - self.bullet_sleep 
            else:
                 self.zidancunhuo=False
        if self.fangxiang == 'R' :
            if self.rect.right < MyGame.windos1.right:  # 往右  #到边界后就不在移动
                self.rect.centerx = self.rect.centerx + self.bullet_sleep
            else:
                 self.zidancunhuo=False



if __name__ == "__main__":
    MyGame().run_game()
